/*
 * 实现一个List类（模拟数据结构里的列表类），包括如下的方法
 * author ubuntuvim
 * website http://ibeginner.sinaapp.com
 */
// listSize(属性) 		列表的元素个数
// pos(属性) 			列表的当前位置
// length(属性) 		返回列表中元素的个数
// clear(方法) 			清空列表中的所有元素
// toString(方法) 		返回列表的字符串形式
// getElement(方法) 	返回当前位置的元素
// insert(方法) 		在现有元素后插入新元素
// append(方法) 		在列表的末尾添加新元素
// remove(方法) 		从列表中删除元素
// front(方法) 			将列表的当前位置设移动到第一个元素
// end(方法) 			将列表的当前位置移动到最后一个元素
// prev(方法) 			将当前位置后移一位
// next(方法) 			将当前位置前移一位
// currPos(方法) 		返回列表的当前位置
// moveTo(方法)			将当前位置移动到指定位置

// constructor
function List() {
	this.listSize = 0;
	this.pos = 0;
	this.dataStore = [];  //初始化一个空的数组保存list的元素
	// this.clear = clear;  //  为List定义一个成员函数
	this.find = find;
	this.toString = toString;
	this.append = append;
	this.insert = insert;
	this.remove = remove;
	this.front = front;
	this.end = end;
	this.prev = prev;
	this.next = next;
	this.currPos = currPos;
	this.moveTo = moveTo;	     
	this.length = length;
	this.getElement = getElement;
	this.contains = contains;              
}


// ====================  下面是各个函数的实现 =============
/**
 * 此方法给列表的下一个位置增加一个新的元素,这 个位置刚好等于变量 listSize 的值
 * @param e 添加的元素
 */
function append(e) {
	this.dataStore[this.listSize++] = e;  //
}

/**
 * 查找元素
 * 返回元素所在的位置，如果不存在则返回-1
 * @param e 查找的元素
 */
function find(e) {
	for (var i = 0; i < this.dataStore.length; i++) {
		if (this.dataStore[i] == e) {
			return i;
		}
	}

	return -1;
}

/**
 * 首先,需要在列表中找到该元素,然后删除它,并且要把删除位置后面的元素前移一个位置
 * 可以借组js提供的方法splice实现删除（splice函数已经实现了前移的作用）
 * 关于splice的详细信息请移步：http://www.w3school.com.cn/jsref/jsref_splice.asp
 * @param e 删除的元素
 * @return true-删除成功；false-删除失败
 */
function remove(e) {
	var removeAt = this.find(e);  //找到要删除的元素的位置
	if (removeAt > -1) {  //要删除的元素存在
		this.dataStore.splice(removeAt, 1);  //删除从removeAt开始往后1的元素
		--this.listSize;  //list长度减一

		return true;
	}

	return false;
}


/**
 * 获取list的长度
 */
function length() {
	return this.listSize;
}


/**
 * 显示list的所有元素
 */
 function toString() {
 	return this.dataStore;  //数组默认实现了toString
 }


 // 测试前面的代码
 // var list = new List();
 // list.append("ubuntuvim");
 // list.append("test");
 // list.append("test append function");
 // print(list.toString());

/**
 * 在指定的元素之后插入一个元素
 * @param e 插入的元素
 * @param posiElem 指定的元素
 * @return true-插入成功；false-插入失败
 */
function insert(e, posiElem) {
	// 找到插入指定的元素的位置
	var position = this.find(posiElem);
	if (position > -1) {
		// * 关于splice的详细信息请移步：http://www.w3school.com.cn/jsref/jsref_splice.asp
		this.dataStore.splice(position+1, 0, e);
		++this.listSize;

		return true;
	}

	return false;
} 


/**
 * 清空列表中所有的元素
 */
function clear() {
	delete this.dataStore;  // 删除dataStore
	this.dataStore = [];  // 重建一个dataStore
	this.listSize = this.pos = 0; 
}


/**
 * 判断元素是否在list中,
 * 与find有点重叠了！！
 * @param e 需要判断的元素
 * @return true-存在；false-不存在
 */
function contains(e) {
	for (var i = 0; i < this.dataStore.length; i++) {
		if (this.dataStore[i] == e) {
			return true;
		}
	}

	return false;
}


/**
 * 设置游标位置为第一个位置
 */
function front() {
	this.pos = 0;
}

/**
 * 设置游标位置为最好一个位置
 */
function end() {
	this.pos = this.listSize - 1;
}


/**
 * 获取游标位置的下一个位置
 */
function next() {
	if (this.pos < this.listSize) {
		++this.pos;
	}
}

/**
 * 获取游标位置的前一个位置
 */
function prev() {
	if (this.pos >= 0) {
		--this.pos;
	}
}

/**
 * 获取游标的当前位置
 */
function currPos() {
	return this.pos;
}

/**
 * 移动游标到指定的位置
 * @param position 指定的位置
 */
function moveTo(position) {
	this.pos = position;
}

/**
 * 获取游标的当前位置的元素值
 */
function getElement() {
	return this.dataStore[this.pos];
}


//  测试程序
// var list = new List();
// list.append("ubuntuvim");
// list.append("second element");
// list.append("test append function");
// list.append("Cynthia");
// list.append("Jennifer");
// list.append("Bryan");
// list.append("Danny");

// // 显示第一个元素
// list.front();
// print("The fisrt element is " + list.getElement());

// list.next();
// print("The next one is " + list.getElement());

// //  测试移动超出范围的情况，之前玩前面227，230这两句代码，游标的位置应该再第二个位置
// list.prev();
// list.prev();
// list.prev();  //  超过范围
// list.prev();  // 超出范围
// print("Now, the element is " + list.getElement());  // 打印出 ubuntuvim 符合预期

// //  迭代显示所有元素
// // 正序显示元素
// print("\n\n正序遍历出所有元素");
// for (list.front(); list.currPos() < list.length(); list.next()) {
// 	print(list.getElement());
// }
// print("\n\n逆序遍历出所有元素");
// for (list.end(); list.currPos() >= 0; list.prev()) {
// 	print(list.getElement());
// }

